package primary.String;

/**
 * @Author Elephas
 * @Date 2022/1/9
 **/
public class MyAtoi {

    public static void main(String[] args) {
        final String TEST01 = "42";
        myAtoi(TEST01);
    }

    /*
        默认s不为空串

     */
    final static int MIN_NEGATIVE = -2147483648;
    final static int MAX_POSITIVE = 2147483647;

    public static int myAtoi(String s){
        if(s == null || "".equals(s))
            return 0;
        char[] chars = s.toCharArray();

        // 丢弃前导空格
        int cur = 0;
        for (int i = 0; i < chars.length; i++) {
            if(chars[i] != ' '){
                cur = i;
                break;
            }
        }
        try {
            // 数字可能存在+-号 默认符号为正
            boolean isNegative = false;
            if (chars[cur] == '+') {
                isNegative = false;
                cur++;
            } else if (chars[cur] == '-') {
                isNegative = true;
                cur++;
            }

            // 开始处理数字部分

            // 处理0000123
            long digits = 0;
            while (chars[cur] == '0') {
                cur++;
            }

            // 开始读入有效字符
            // 检查数字长度有效长度位数

            int len = 0;
            for (int i = cur; i < chars.length; i++) {
                if (chars[i] >= '0' && chars[i] <= '9')
                    len++;
                else
                    break;
                ;
            }

            if (len < 10) {
                // 有效数值部分小于10位，不需要考虑边界条件
                for (int i = 0; i < len; i++) {
                    digits = digits * 10 + (chars[cur++] - '0');
                }
                // 直接截断
                return isNegative ? (int) -digits : (int) digits;
            } else if (len == 10) {
                // 有效数字大于10位，考虑边界条件
                for (int i = 0; i < len; i++) {
                    digits = digits * 10 + (chars[cur++] - '0');
                }
                if (isNegative) {
                    if (-digits < MIN_NEGATIVE) {
                        return MIN_NEGATIVE;
                    } else {
                        return (int) -digits;
                    }
                } else {
                    if (digits > MAX_POSITIVE) {
                        return MAX_POSITIVE;
                    } else {
                        return (int) digits;
                    }
                }


            } else {
                // 有效数字大于10位，必定正溢出或者负溢出，根据符号判定
                if (isNegative) {
                    return MIN_NEGATIVE;
                } else {
                    return MAX_POSITIVE;
                }
            }
        }catch (IndexOutOfBoundsException e){
            return 0;
        }

    }
}
